import dayjs from "dayjs";
import { resolve } from "path";
import pkg from "./package.json";
import { warpperEnv } from "./build";
import { getPluginsList } from "./build/plugins";
import { include, exclude } from "./build/optimize";
import { UserConfigExport, ConfigEnv, loadEnv } from "vite";
import { lazyImport, VxeResolver } from 'vite-plugin-lazy-import';

/** 当前执行node命令时文件夹的地址（工作目录） */
const root: string = process.cwd();

/** 路径查找 */
const pathResolve = (dir: string): string => {
    return resolve(__dirname, ".", dir);
};

/** 设置别名 */
const alias: Record<string, string> = {
    "@": pathResolve("src"),
    "@build": pathResolve("build")
};

// 从pkg对象中解构出dependencies、devDependencies、name、version属性
const { dependencies, devDependencies, name, version } = pkg;
// 定义一个__APP_INFO__对象，包含pkg对象和lastBuildTime属性
const __APP_INFO__ = {
    // 将pkg对象中的dependencies、devDependencies、name、version属性赋值给__APP_INFO__对象的pkg属性
    pkg: { dependencies, devDependencies, name, version },
    // 将当前时间格式化为"YYYY-MM-DD HH:mm:ss"的字符串，赋值给__APP_INFO__对象的lastBuildTime属性
    lastBuildTime: dayjs(new Date()).format("YYYY-MM-DD HH:mm:ss")
};

// 导出一个默认函数，接收一个ConfigEnv类型的参数
export default ({ command, mode }: ConfigEnv): UserConfigExport => {
    // 从loadEnv函数中加载环境变量
    const { VITE_CDN, VITE_PORT, VITE_COMPRESSION, VITE_PUBLIC_PATH } =
        warpperEnv(loadEnv(mode, root));
    // 配置 lazyImport 插件
    const lazyImportPlugins = [
        lazyImport({
            resolvers: [
                VxeResolver({
                    libraryName: 'vxe-table',
                }),
                VxeResolver({
                    libraryName: 'vxe-pc-ui',
                }),
            ],
        }),
    ];
    // 返回一个UserConfigExport类型的对象
    return {
        // plugins: [
        //     getPluginsList(command, VITE_CDN, VITE_COMPRESSION),
        //     ...lazyImportPlugins
        // ],
        // 设置项目的基础路径
        base: VITE_PUBLIC_PATH,
        // 设置项目的根目录
        root,
        // 设置路径别名
        resolve: {
            alias
        },
        // 服务端渲染
        server: {
            // 是否开启 https
            https: false,
            // 端口号
            port: VITE_PORT,
            host: "0.0.0.0",
            // 本地跨域代理 https://cn.vitejs.dev/config/server-options.html#server-proxy
            proxy: {}
        },
        //@ts-ignore
        plugins: getPluginsList(command, VITE_CDN, VITE_COMPRESSION),
        // https://cn.vitejs.dev/config/dep-optimization-options.html#dep-optimization-options
        // 优化依赖
        optimizeDeps: {
            // 包含的依赖
            include,
            // 排除的依赖
            exclude
        },
        build: {
            // 是否生成source map
            sourcemap: false,
            // 消除打包大小超过500kb警告
            chunkSizeWarningLimit: 4000,
            // rollup配置选项
            rollupOptions: {
                // 输入文件
                input: {
                    // index.html文件路径
                    index: pathResolve("index.html")
                },
                // 静态资源分类打包
                output: {
                    chunkFileNames: "static/js/[name]-[hash].js",
                    entryFileNames: "static/js/[name]-[hash].js",
                    assetFileNames: "static/[ext]/[name]-[hash].[ext]"
                }
            }
        },
        define: {
            // 生产环境不使用Intl的devtools
            __INTLIFY_PROD_DEVTOOLS__: false,
            // 应用信息
            __APP_INFO__: JSON.stringify(__APP_INFO__)
        }
    };
};
